﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ClassFolio.Model;
using System.Data.OracleClient;
using System.Data;
using ClassFolio;
using System.Globalization;
using System.Configuration;

namespace OraFolio.Gates
{
    public class OraAreaWorkGate : IAreaWorkGate
    {
		/// <summary>
		/// Возвращает соединение с базой данных
		/// </summary>
		/// <param name="login">Логин пользователя</param>
		/// <param name="password">Пароль пользователя</param>
		/// <param name="source">Источник данных с которым должно быть установлено соединение</param>
		/// <returns>Если соединение успешно установлено, возвращается значение true, если нет - false</returns>
        public bool Connect(string login, string password, string source)
        {
            // TODO: строки получать из файла настроек
            string auth_login = "AUTH_FOLIO";
            string auth_password = "Ercnmkj01";
            string auth_server = "XE";

            // Открывается гостевое соединение с базой
            if (OraDB.Connect(auth_login, auth_password, auth_server))
            {
                string sql = "begin auth_folio.login(:1, :2, :3, :4); end;";
                OracleCommand cmd = new OracleCommand(sql, OraDB.Connection, OraDB.Transaction);
                cmd.Parameters.Add("1", OracleType.VarChar).Direction = ParameterDirection.Input;
                cmd.Parameters["1"].Value = login;
                cmd.Parameters.Add("2", OracleType.VarChar).Direction = ParameterDirection.Input;
                cmd.Parameters["2"].Value = password;

                cmd.Parameters.Add("3", OracleType.VarChar, 32).Direction = ParameterDirection.Output;
                cmd.Parameters.Add("4", OracleType.VarChar, 32).Direction = ParameterDirection.Output;

                // Получаем не гостевое соединение с базой и устанавливаем постоянное соединение
                try
                {
                    cmd.ExecuteNonQuery();
                    string connect_login = cmd.Parameters["3"].Value.ToString();
                    string connect_password = cmd.Parameters["4"].Value.ToString();
                    OraDB.Connect(connect_login, connect_password, source);
                    return true;
                }
                catch
                {
                    throw new EFolio(0, MessageType.UserMessage, Messages.login, null);
                }
            }
            else
                return false;
        }

		/// <summary>
		/// Возвращает идентификатор пользователя по его логину
		/// </summary>
		/// <param name="login">Логин пользователя</param>
		/// <returns>Идентификатор пользователя в базе данных</returns>
		/// <exception cref="EFolioSource">Если пользователь не найден в базе данных, генерируется исключение
		/// с сообщением для пользователя</exception>
        public int getUserId(string login)
        {
            OraDB.CheckConnection();
            string sql = "begin :1 := folio.users_pkg.get_user_id(:2); end;";
            OracleCommand cmd = new OracleCommand(sql, OraDB.Connection, OraDB.Transaction);
            cmd.Parameters.Add("1", OracleType.Number).Direction = ParameterDirection.Output;
            cmd.Parameters.Add("2", OracleType.VarChar).Direction = ParameterDirection.Input;
            cmd.Parameters["2"].Value = login;

            try
            {
                cmd.ExecuteNonQuery();
                return Convert.ToInt32(cmd.Parameters["1"].Value, CultureInfo.InvariantCulture); ;
            }
            catch (Exception err)
            {
                throw new EFolioSource(0, MessageType.AllertLog, Messages.um_get_user_id_by_login, err);
            }
        }

		public void GetActionsForUser(User user)
		{
			Actions.Default.AddRange(User.LogonUser.ActionList);
		}
    }
}
